package oop;

import java.awt.Graphics;
import java.awt.Image;

/**
 *
 * @author TxGVNN
 */
public class Weapon {

    // Các hướng di chuyển
    public static final int DIRECTION_UP = 0;
    public static final int DIRECTION_RIGHT = 1;
    public static final int DIRECTION_DOWN = 2;
    public static final int DIRECTION_LEFT = 3;

    Sprite sprite;
    private int direction, toaDo[][];  // toa độ các chưởng được vẽ
    private int typeAttack;             // loại chưởng
    public int limit = 20;              // lặp 20 lần vẽ/ 1 chưởng
    private boolean draw = true;        // Sử dụng cho chưởng trên trời

    // Kiểu vũ khí, mặc đinh là 1
    final int MAT_TRANG = 1; // Mặt trăng khuyết
    final int DAN_TRON = 2;  // Đạn tròn
    final int DAN_KHOI_1 = 3;  // đạn khói
    final int RONG = 4;  //  Đầu rồng
    final int SAO_BANG = 5;  // chưởng trên trời
    final int SAO_XANH = 6;  // chưởng trên trời

    /**
     * Khởi tạo
     *
     * @param direction: Hướng nhân vật đang di chuyển
     * @param x: tọa độ vẽ
     * @param y:
     * @param typeAttack: loại tấn công
     */
    Weapon(int direction, int x, int y, int typeAttack) {
        this.direction = direction;
        this.typeAttack = typeAttack;
        try {
            switch (typeAttack) {
                case MAT_TRANG:  // Chưởng mặt trăng khuyết
                    toaDo = new int[1][2];
                    toaDo[0][0] = x;
                    toaDo[0][1] = y;
                    sprite = new Sprite("/mat_trang.png", 20, 20, direction * 20, 0);
                    break;
                case DAN_TRON:  // chưởng tròn
                    toaDo = new int[1][2];
                    sprite = new Sprite("/dan_tron.png", 20, 20);
                    toaDo[0][0] = x;
                    toaDo[0][1] = y;
                    break;
                case DAN_KHOI_1: // Chưởng lưa
                    limit = 23;
                    toaDo = new int[1][2];
                    sprite = new Sprite("/fire.png", 32, 32);
                    toaDo[0][0] = x;
                    toaDo[0][1] = y;
                    break;
                case RONG:  // CHưởng đầu rồng
                    limit = 23;
                    toaDo = new int[1][2];
                    if (direction == DIRECTION_UP || direction == DIRECTION_DOWN) {
                        sprite = new Sprite("/rong_ud.png", 22, 40);
                    } else {
                        sprite = new Sprite("/rong_rl.png", 40, 20);
                    }
                    toaDo[0][0] = x;
                    toaDo[0][1] = y;
                    break;
                case SAO_BANG:  // Chưởng sao băng
//                    if (Math.sqrt((entity.x - x) * (entity.x - x) + (entity.y - (y + 80)) * (entity.y - (y + 80))) > entity.range) {
//                        draw = false;
//                        return;
//                    }

                    limit = 11;
                    toaDo = new int[1][2];
                    sprite = new Sprite("/sao_bang.png", 20, 40);
                    toaDo[0][0] = x;
                    toaDo[0][1] = y;
                    break;
                case SAO_XANH:  // CHưởng tia màu xanh
//                    if (Math.sqrt((entity.x - x) * (entity.x - x) + (entity.y - (y + 80)) * (entity.y - (y + 80))) > entity.range) {
//                        draw = false;
//                        return;
//                    }
                    limit = 11;
                    toaDo = new int[1][2];
                    sprite = new Sprite("/sao_xanh.png", 20, 40);
                    toaDo[0][0] = x;
                    toaDo[0][1] = y;
                    break;
                default:
                    return;
            }
        } catch (Exception e) {
            System.out.println("Weapon: " + e.getMessage());
        }

    }

    boolean isVisible() {
        if (!sprite.isVisible()) {
            return false;
        }
        if (limit <= 0) {
            return false;
        }
        return true;

    }

    /**
     * Vẽ chưởng
     *
     * @param g
     */
    public void paint(Graphics g) {
        if (!sprite.isVisible()) {
            return;
        }
        switch (typeAttack) {
            case MAT_TRANG:
                switch (direction) {
                    case DIRECTION_UP:
                        toaDo[0][1] -= 10;
                        break;
                    case DIRECTION_DOWN:
                        toaDo[0][1] += 10;
                        break;
                    case DIRECTION_RIGHT:
                        toaDo[0][0] += 10;
                        break;
                    case DIRECTION_LEFT:
                        toaDo[0][0] -= 10;
                        break;
                }
                sprite.paint(g, toaDo[0][0], toaDo[0][1]);
                break;
            case DAN_TRON:
                switch (direction) {
                    case DIRECTION_UP:
                        toaDo[0][1] -= 10;
                        break;
                    case DIRECTION_DOWN:
                        toaDo[0][1] += 10;
                        break;
                    case DIRECTION_RIGHT:
                        toaDo[0][0] += 10;
                        break;
                    case DIRECTION_LEFT:
                        toaDo[0][0] -= 10;
                        break;
                }
                sprite.paint(g, toaDo[0][0], toaDo[0][1]);
                if (limit % 6 == 0) {
                    sprite.nextFrame();
                }
                break;
            case DAN_KHOI_1:
                switch (direction) {
                    case DIRECTION_UP:
                        toaDo[0][1] -= 10;
                        sprite.setFrame(Entity.DIRECTION_UP);
                        break;
                    case DIRECTION_DOWN:
                        toaDo[0][1] += 10;
                        sprite.setFrame(Entity.DIRECTION_DOWN);
                        break;
                    case DIRECTION_RIGHT:
                        toaDo[0][0] += 10;
                        sprite.setFrame(Entity.DIRECTION_RIGHT);
                        break;
                    case DIRECTION_LEFT:
                        toaDo[0][0] -= 10;
                        sprite.setFrame(Entity.DIRECTION_LEFT);
                        break;

                }
                sprite.paint(g, toaDo[0][0], toaDo[0][1]);
                if (limit % 6 == 0) {
                    sprite.nextFrame();
                }
                break;

            case RONG:
                switch (direction) {
                    case DIRECTION_UP:

                        toaDo[0][1] -= 10;
                        sprite.setFrame(1);
                        break;
                    case DIRECTION_DOWN:
                        toaDo[0][1] += 10;
                        sprite.setFrame(0);
                        break;
                    case DIRECTION_RIGHT:
                        toaDo[0][0] += 10;
                        sprite.setFrame(0);
                        break;
                    case DIRECTION_LEFT:
                        toaDo[0][0] -= 10;
                        sprite.setFrame(1);
                        break;

                }
                sprite.paint(g, toaDo[0][0], toaDo[0][1]);
                if (limit % 4 == 0) {
                    sprite.nextFrame();
                }
                break;

            case SAO_BANG:
            case SAO_XANH:
                if (draw) {
                    toaDo[0][0] += 1;
                    toaDo[0][1] += 10;

                    sprite.paint(g, toaDo[0][0], toaDo[0][1]);
                    if (limit % 6 == 0) {
                        sprite.nextFrame();
                    }
                }
                break;

        }
        limit--;
    }

    boolean checkCollison(Entity other) {
        if (sprite.collision(other.sprite)) {
            sprite.setVisible(false);
            return true;
        }
        return false;
    }

}
